`default_nettype none

module right_shift_reg_m #(
    parameter [31:0] WIDTH_CP_I = 2,
    parameter [31:0] SHIFT_WIDTH_CP_I = 1,
    parameter [WIDTH_CP_I-1:0] INIT_VALUE_CP_I = 0
) (
    input rst_w_ni,
    input clk_w_i,
    input shift_en_w_pi,
    input [SHIFT_WIDTH_CP_I-1:0] data_wp_i,
    input set_en_w_pi,
    input [WIDTH_CP_I-1:0] set_wp_i,

    output [SHIFT_WIDTH_CP_I-1:0] data_wp_o,
    output [WIDTH_CP_I-1:0] get_wp_o
);
    wire [WIDTH_CP_I-1:0] set_if_shift_wp_l;
    assign {set_if_shift_wp_l, data_wp_o} = {data_wp_i, get_wp_o};
    wire [WIDTH_CP_I-1:0] real_set_wp_l =
        set_en_w_pi ? set_wp_i : set_if_shift_wp_l;

    dreg_m #(
        .WIDTH_CP_I(WIDTH_CP_I),
        .INIT_VALUE_CP_I(INIT_VALUE_CP_I)
    ) dreg_i (
        .rst_w_ni(rst_w_ni),
        .clk_w_i(clk_w_i),
        .set_en_w_pi(shift_en_w_pi || set_en_w_pi),
        .set_wp_i(real_set_wp_l),

        .get_wp_o(get_wp_o)
    );
endmodule
